import { Controller } from 'egg';
import AddUserRule from '../validate/addUserRule';
import xlsx from 'node-xlsx';
const path = require('path');
const fs = require('fs');

export default class UsersController extends Controller {
  // 获取单个用户信息
  public async userInfo() {
    const { ctx } = this;
    const { id } = ctx.params;
    try {
      const user = await ctx.service.users.getOneUsers(id);
      ctx.success(user);
    } catch (e) {
      ctx.error(400, e.message);
    }
  }
  // 获取全部用户信息
  public async allUsers() {
    const { ctx } = this;
    try {
      // 获取所有用户信息
      const users = await ctx.service.users.getUsers();
      // users.map(item => delete item.dataValues.password);
      ctx.success(users);
    } catch (e) {
      ctx.error(500, e.message);
    }
  }
  // 根据分页条件获取全部用户信息
  public async UserPage() {
    const { ctx } = this;
    try {
      // 获取所有用户信息
      // const users = await ctx.service.users.getUsers();
      // 根据条件去获取
      const users = await ctx.service.users.getUserList(ctx.query);
      ctx.success(users);
    } catch (e) {
      ctx.error(500, e.message);
    }
  }
  // 新增用户
  public async create() {
    const { ctx } = this;
    const data = ctx.request.body;
    try {
      // 检验数据
      ctx.validate(AddUserRule, data);
      // 将校验通过的数据保存到数据库中
      const users = await ctx.service.users.createUsers(data);
      ctx.success(users);
    } catch (e) {
      if (e.errors) {
        ctx.error(400, e.errors);
      } else {
        ctx.error(400, e.message);
      }
    }
  }
  // 删除用户
  public async destroy() {
    const { ctx } = this;
    const { id } = ctx.params;
    try {
      // 根据 id 去删除指定用户
      const user = await ctx.service.users.destroyUsers(id);
      ctx.success(user);
    } catch (e) {
      ctx.error(400, e.message);
    }
  }
  // 编辑用户
  public async update() {
    const { ctx } = this;
    const { id } = ctx.params;
    const data = ctx.request.body;
    try {
      // 检验数据
      ctx.validate(AddUserRule, data);
      // 查找这个 id 的用户信息
      const user = await ctx.service.users.updateUsers(id, data);
      ctx.success(user);
    } catch (e) {
      if (e.error) {
        ctx.error(400, e.error);
      } else {
        ctx.error(400, e.message);
      }
    }
  }
  // 头像上传
  public async posts() {
    const { ctx } = this;
    // 1.拿到上传过来的文件
    const file = ctx.request.files[0]; // 图片只有一张 所有取0
    // 2.生成一个独一无二的文件名称 path.extname(xx)获取文件后缀名
    const fileName = ctx.helper.encryptText(file.filename + Date.now()) + path.extname(file.filename);
    // 生成存储文件的绝对路径
    let filePath = path.join('/public/uploads', fileName);
    const absFilePath = path.join(this.config.baseDir, 'app', filePath);
    // console.log(absFilePath);
    // console.log(file.filepath, '111111');
    // 读取文件准备写入 将要读取的文件内容完整读入缓存区，再从该缓存区中读取文件内容
    const readStream = fs.readFileSync(file.filepath);
    // 写入文件 将要写入的文件内容完整的读入缓存区，然后一次性的将缓存区中的内容写入都文件中
    fs.writeFileSync(absFilePath, readStream);
    // 存储地址返回给客户端
    filePath = filePath.replace(/\\/g, '/');
    ctx.success(filePath);
  }
  // 导入Excel用户表
  public async importUser() {
    const { ctx } = this;
    let transaction;
    try {
      const file = ctx.request.files[0];
      // console.log(file);
      const workSheetsFromBuffer = xlsx.parse(fs.readFileSync(file.filepath));
      // console.log(workSheetsFromBuffer);
      const sheeet1Data = workSheetsFromBuffer[0].data;
      // 组合数据
      const users: any[] = [];
      // 开启事务
      transaction = await ctx.model.transaction();
      for (let i = 1; i < sheeet1Data.length; i++) {
      // 拿到第一行的标题作为key
        const sheet1Key = sheeet1Data[0];
        // console.log(sheet1Key);
        const sheet1Value = sheeet1Data[i];
        const user = {};
        for (let j = 0; j < sheet1Key.length; j++) {
        // 对应赋值, 例如 username:xiaotuxian005
          user[sheet1Key[j]] = sheet1Value[j];
        }
        // 将处理好的数据新增到数据库中
        await ctx.service.users.createUsers(user);
        users.push(user);
        // console.log(users);
      }
      // 在处理好数据库后事务成功
      await transaction.commit();
      ctx.success(users);
    } catch (e) {
      // 失败则回滚
      await transaction.rollback();
      ctx.error(500, e.message);
    }
  }
  // 导出用户
  public async exportUser() {
    const { ctx } = this;
    // 获取所有用户
    const users = await ctx.service.users.getUsers();
    // 取出其中一个用来获取key值
    const user = users.length ? users[0].dataValues : null;
    // console.log(user);
    if (user) {
      // 创建导出用户的数组数据
      const data: any[] = [];
      // 得到key值数组
      const cloumnTitles = Object.keys(user);
      data.push(cloumnTitles);
      users.forEach(user => {
        console.log(user);
        const temp: any[] = [];
        cloumnTitles.forEach(key => {
          // 得到每组的value值
          temp.push(user[key]);
        });
        // console.log(temp);
        data.push(temp);
      });
      // console.log(data);
      // node-xlsx 导出处理
      const buffer = xlsx.build([{ name: 'mySheetName', data }]); // Returns a buffer
      // 设置导出的格式type
      ctx.set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
      // 设置导出的文件名
      ctx.attachment('user.xlsx');
      // 打印
      ctx.body = buffer;
    }
  }
}
